//package com.yuxi.distributelock;
//
//import redis.clients.jedis.Jedis;
//
///**
// * Created by yuxi on 16/12/26.
// */
//public class RedLock {
//    private static  Jedis jedis =new Jedis("127.0.0.1",6379);
//
//    private final long expired = 3000;
//
//    public boolean acquireLock(String lock) {
//        // 1. 通过SETNX试图获取一个lock
//        boolean success;
//        long value = System.currentTimeMillis() + expired + 1;
//        System.out.println(value);
//        long acquired = jedis.setnx(lock, String.valueOf(value));
//        //SETNX成功，则成功获取一个锁
//        if (acquired == 1l)
//            success = true;
//            //SETNX失败，说明锁仍然被其他对象保持，检查其是否已经超时
//        else {
//            long oldValue = Long.valueOf(jedis.get(lock));
//            //超时
//            if (oldValue < System.currentTimeMillis()) {
//                //获取原原来的值
//                String getValue = jedis.getSet(lock, String.valueOf(value));
//                // 获取锁成功
//                if (Long.valueOf(getValue) == oldValue) {
//                    success = true;
//                } else {
//                    success = false;
//                }
//            } else {//说明此刻有其他的线程正在使用锁
//                success = false;
//            }
//        }
//        return success;
//    }
//
//    //释放锁
//    public void releaseLock(String lock) {
//        long current = System.currentTimeMillis();
//        // 避免删除非自己获取得到的锁
//        if (current < Long.valueOf(jedis.get(lock))) {
//            jedis.del(lock);
//        }
//    }
//
//    public static void main(String[] args) {
//        RedLock r = new RedLock();
//        for (int i = 0; i < 10; i++) {
//            new MyThread(r).start();
//        }
//
//    }
//
//    static class MyThread extends Thread {
//        RedLock redLock;
//
//        public MyThread(RedLock redLock) {
//            this.redLock = redLock;
//        }
//
//        @Override
//        public void run() {
//            boolean flag = redLock.acquireLock("key");
//            System.out.println(Thread.currentThread().getName() + "====" + flag);
//        }
//    }
//}
